package main

import (
	"encoding/json"
	"fmt"
)

/*
key-value
键值存储 map -- dict底层是哈希桶存储
key 天生去重  值类型(整型，字符型，布尔) 引用类型（切片，指针，map）
value 可以重复
哈希算法是一种加密算法，无序 将任意长度的数据（通常称为“消息”）转换为固定长度的输出
单向加密，意味着从原始数据生成哈希值很容易，但从哈希值反推原始数据是非常困难甚至是不可能的。
确定性：对于相同的输入数据，哈希算法总是产生相同的哈希值。
唯一性：不同的输入数据几乎总是产生不同的哈希值。理想情况下，即使是微小的变化也会导致完全不同的哈希值。
不可逆性：很难（如果不是不可能的话）从哈希值反推原始输入数据。
抗碰撞性：找到两个不同的输入数据，使得它们产生相同的哈希值是非常困难的。
数据完整性验证：通过比较文件的哈希值来验证文件是否被篡改。
密码存储：存储经过哈希处理的密码，而不是明文密码。

map 字段 bucket存放指向底层hash桶的指针
var name map[key_type]value_type]
make申明 申请年轻内存空间，用来做slice map channel初始化
name := make(map[key_type]value_type)
*/

//country := make(map[string]string, 100)
//country["China"] = "中国"
//country["USA"] = "美国"
//country["UK"] = "英国"
//println(country["China"])
//fmt.Println(country, country["China"])
//for k, v := range country {
//	println(k, v)
//}
//判断key在不在map中
//value, ok := country["China"]
//ok是状态 为true表示能正常取到值
//if ok {
//	println(value)
//} else {
//	println("key not exist")
//}
//声明复制
//country := map[string]string{
//	"China": "中国",
//	"USA":   "美国",
//	"UK":    "英国",
//}
//遍历
//for k, v := range country {
//	println(k, v)
//}
//delete(country, "UK")
//fmt.Println(country)
/*
	{"root": {"password":"123456","age":18,"sex":"男","hobby":["吃饭","睡觉","打豆豆"],"address":{"province":"北京","city":"北京","street":"东城区"}}}
*/
//userinfo := map[string]map[string]string{
//	"root": {
//		"password": "123456",
//		"age":      "18",
//		"sex":      "男",
//	},
//	"admin": {
//		"password": "123456",
//		"age":      "18",
//		"sex":      "男",
//	},
//}
//fmt.Println(userinfo)

// 学生信息系统添加   无限次数添加查询 返回上一级 按q退出
// 1.添加学生信息  判断此用户名有没有添加过，没有就提示输入学生信息（姓名，年龄，性别，住址）
// 2.查询学生信息 按名字查询 判断输入的名字有没有添加过，有就输出信息，没有就提示没有添加过
// json map转换成json  字符串json转map 信息固化
func main() {
	stuinfo := map[string]map[string]string{
		"huang": {
			"age":     "18",
			"sex":     "女",
			"address": "长沙",
		},
		"zhang": {
			"age":     "19",
			"sex":     "男",
			"address": "武汉",
		},
		"li": {
			"age":     "21",
			"sex":     "女",
			"address": "上海",
		},
		"wang": {
			"age":     "20",
			"sex":     "男",
			"address": "广州",
		},
		"zhou": {
			"age":     "22",
			"sex":     "男",
			"address": "深圳",
		},
	}
	for {
		fmt.Println("1:添加学生信息  2:查询学生信息 q:退出系统")
		var choice string
		fmt.Scanln(&choice)
		switch choice {
		case "1":
			fmt.Println("开始添加学生信息")
			var name, age, sex, address string
			fmt.Print("请输入学生姓名 年龄 性别 住址: ")
			_, _ = fmt.Scanln(&name, &age, &sex, &address)
			if _, exists := stuinfo[name]; exists {
				fmt.Println("该学生已存在，请勿重复添加")
			} else {
				// 添加学生信息，而不是整个 newStudent 字典
				stuinfo[name] = map[string]string{
					"age":     age,
					"sex":     sex,
					"address": address,
				}
				fmt.Println("添加成功")
			}
			fmt.Println(stuinfo)
		case "2":
			fmt.Println("开始查询学生信息,请输入要查询的学生姓名")
			var name string
			fmt.Scanln(&name)
			value, ok := stuinfo[name]
			if ok {
				fmt.Println(value)
			} else {
				fmt.Println("该学生不存在，请先添加")
			}
		case "q":
			fmt.Println("退出系统")
			return
		}
	}
}
func toJSON(stuinfo map[string]string) ([]byte, error) {
	jsonBytes, err := json.Marshal(stuinfo)
	if err != nil {
		return nil, err
	}
	return jsonBytes, nil
}
func fromJSON(jsonString string) (map[string]*string, error) {
	var stuinfo map[string]*string
	err := json.Unmarshal([]byte(jsonString), &stuinfo)
	if err != nil {
		return nil, err
	}
	return stuinfo, nil
}
